/*
  Textures source code

*/

#ifndef TEXTURES_C
#define TEXTURES_C

#include <stdio.h>

#define GL_GLEXT_PROTOTYPES

#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glu.h>
#include <GL/glext.h>
#include <GL/glcorearb.h>

#include "bmp_reader.h"

/* На входе - имя BMP файла, на выходе - идентификатор текстуры в OpenGL */
unsigned int loadBmpTexture(char* fname) {

  BMPInfo* bm_inf = bmp_load(fname); /* Загружаем BMP-файл */
  if(!bm_inf) {
    printf("Error loading bmp: %s\n", bmp_get_err());
    return 0;
  };

  unsigned int tex;
  glGenTextures(1, &tex);             /* Генерируем объект для текстуры */
  glBindTexture(GL_TEXTURE_2D, tex);  /* Делаем его активным */

  /*  Если глубина цвета не 32 бита, то используем модеть RGB,
      в противном случае - RGBA */
  if(bm_inf->dib.bpp != 32)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bm_inf->dib.width,
      bm_inf->dib.height, 0, GL_RGB,
      GL_UNSIGNED_BYTE, bm_inf->data);
  else
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm_inf->dib.width,
      bm_inf->dib.height, 0, GL_RGBA,
      GL_UNSIGNED_BYTE, bm_inf->data);

  /* Генерируем уменьшеные копии изображений (для удаленных от камеры объектов) */
  glGenerateMipmap(GL_TEXTURE_2D);
  bmp_free(bm_inf); /*  Как только объект текстуры загружен,
                        исходные данные можно удалить */
  return tex;
};

#endif
